package com.yc.thread;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @program: concurrent
 * @description: 清除线程中断状态并重新中断线程
 * @author: zy
 * @create: 2022-01-10 11:03
 */
public class Test9_ReInterrupted extends Thread{
    public static void main(String[] args) throws Exception {
        // 当前线程main。
        String threadName = Thread.currentThread().getName();

        Test9_ReInterrupted reInterrupt = new Test9_ReInterrupted();   //创建线程
        System.out.println(printDate() + threadName + "线程启动");
        // 启动新线程。
        reInterrupt.start();


        // main主线程休眠3秒。
        Thread.sleep(3000);
        System.out.println(printDate() + threadName + "发出中断信号, 设置子线程中断");
        // 对新线程设置线程中断
        reInterrupt.interrupt();

        // 主线程休眠3秒。
       // Thread.sleep(3000);
        System.out.println(printDate() + threadName + "运行结束");
    }

    @Override
    public void run() {
        // 当前线程。
        String threadName = Thread.currentThread().getName();
        int i=0;
        // for循环等待线程中断。    只要当前线程不是中断态，则继续 ，是中断，则退出当前线程
        while (    !Thread.currentThread().isInterrupted()) {

            System.out.println( printDate() + threadName + "线程正在执行第:"+(++i)+"次");
            try {
                // 应该会执行3次。
                // 线程阻塞，如果线程收到中断操作信号将抛出异常。
                Thread.sleep(1000);
            } catch (InterruptedException e) {    //因为catch，所以中断信号又恢复成  false
                System.out.println(printDate() + threadName + "线程正在执行,收到中断信号,进入catch块处理");
                // 检测线程是否中断。
                System.out.println(printDate() + threadName+"的状态:" + this.isInterrupted()); //false
                // 如果需要维护中断状态，则需要重新设置中断状态。
                // TODO: 如果不需要，则不用调用。  如果调用   interrupt()的话，则当前线程的状态变为中断，这个  while循环退出，程序结束.
                Thread.currentThread().interrupt();   // true  //TODO:如果注释这一句的话，则中断不启作用，while循环仍会继续，   想像一下，这样对一些偶然出现的小问题并不会让任务结束.
            }
        }
        System.out.println(printDate() + threadName + "线程是否被中断：" + this.isInterrupted());
        System.out.println(printDate() + threadName + "线程退出");
    }

    private static String printDate() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date()) + " ";
    }
}
